<?php
namespace ThirdPay;

use ThirdPay\Tools;
use think\Db;

class Notify
{

	public function Handle($params,$publicKey) {
		if(empty($params)){
			file_put_contents(ROOT_PATH."pay.log",date('Y-m-d H:i:s')."第三方支付异步通知为空".PHP_EOL,FILE_APPEND);
			return false;
		}
		//$result = $_GET;
		//$result = '{"merAccount":"4ec4cffa746042f793e3506223a35e8e","data":"t9mfCRZDe7GB2T\/KAdwtwTj6As4MmMUNpH84S3lS453FwR7BqbOOvdBpMIlDFXFH7KJtwl8uM4IU\n1WGdMUFQeis9yakl5plMBCXIgiPqCvArP1J2lSeRcgxlLsuxMLYzo2VaRQrDVSCusFj7G6CVf1mt\nTbHz8ztuYueq+S44d60++5nH8a05k3wJFJFEXk4qaONvkbtPWx4PLEmyduILoZOjk78kwC7uOW5r\ncg7i1F+qCRaZlOGFG6bEq+lJyM4HN7+m51lfItqaO7\/7qwDdDMXvULlBGVIx2bsDz\/zSJBvlFMFd\n64N34gFbCFVDvKRxhXU8zZcC6BNvEBaExaDR9JcLKxM\/A0IX9qgZX6P2kZIjvsPzTu8TvTrFGdMW\nnYQMnHujeDWq8FPu3neObg5AYH4wljAWliY7Kvr\/fSnPY5Clg2GDOM7Kc6oIFsicPdBxq3NC+zh6\noFzs7IBVHccvqIB1dUiO5WJRonmeXbRBYKtXcCih6eMeSnHsitf+Yo7x","orderId":"CZ_201904121550506337"}';
		//$params =json_decode($result,true);
		$data = Tools::decryptData($params['data'],$publicKey);
		
		$data = json_decode($data,true);
		if(empty($data)){
			file_put_contents(ROOT_PATH."pay.log",date('Y-m-d H:i:s')."第三方支付回调解密为空".PHP_EOL,FILE_APPEND);
			return false;
		}
		//去本地服务器检查订单状态
        $order = $this->getOrder($data["orderId"]);
        if(empty($order)) {
			file_put_contents(ROOT_PATH."pay.log",date('Y-m-d H:i:s')."----".$data["orderId"]."本地订单不存在".PHP_EOL,FILE_APPEND);
            return false;
        }
		
		//检查订单状态
        if($this->checkOrderStatus($order)) {
            // 如果订单处理过, 则直接返回true
            return true;
        }
		
		// 订单状态未修改情况下, 进行处理业务
        $result = $this->processOrder($order, $data);
        if(!$result) {
            return false;
        }
        return $order;
	}


	// 去本地服务器查询订单信息
    public function getOrder($out_trade_no)
    {
        // 可根据商户订单号进行查询
        // 例如:
        $order = Db::name('order')->where('out_trade_no', $out_trade_no)->find();
        return $order;
    }

	public function checkOrderStatus($order)
    {
        // 检查还未修改, 则返回true, 检查已经修改过了, 则返回false
        // 例如:
        return $order['status'] == 1 ? true : false;
    }

	/**
     * 处理核心业务
     * @param  array $order 订单信息
     * @param  array $data  通知数组
     * @return Bollean
     */
    public function processOrder($order, $data)
    {
		
        // 进行核心业务处理, 如更新状态, 发送通知等等
        // 处理成功, 返回true, 处理失败, 返回false
        $result = Db::name('order')->where('id', $order['id'])->update(['status'=>1, 'transaction_id'=>$data['mbOrderId'],'update_time'=>time()]);
        return $result;
    }

}